package jdk8.lambda;

import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Supplier;

public class MethodRefDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		//1. 构造方法引用
		Supplier<String> ss = String::new;
		Supplier<String> ss2 = () -> new String();
		Supplier<String> ss3 = new Supplier<String>() {
			@Override
			public String get() {
				
				return new String();
			}
		};
		//
		System.out.println(ss.get() == ss2.get());
		
		//创建Animal对象
		Animal a1 = AnimalFactory.create(Cat::new); // ( () -> new Cat(); )
		Animal a2 = AnimalFactory.create(Dog::new);
		//
		a1.eat();
		System.out.println("-------------");
		a2.eat();
		
		Animal a3 = AnimalFactory.create(Fish::new);
		System.out.println("-------------");
		a3.eat();
	
		//
		Supplier<Integer> si = () -> (int)(Math.random()*1000); //此处不能使用方法引用
		//基于我们自己创建的一个 IntUtil类
		Supplier<Integer> si2 = IntUtil::randomIntlt1000; //这里就是静态方法的引用
		//
		System.out.println(si.get());
		System.out.println(si2.get());
		
		//
		Consumer<String> cs = (t) -> System.out.println(t); //这里也是静态方法引用，带了参数
		Consumer<String> cs2 = System.out::println; 
		//带不带参数，是由目标接口的抽象方法决定的。
		
		//实例方法
		Comparator<String> ct = new Comparator<String>() {
			
			@Override
			public int compare(String o1, String o2) {
				return o1.compareToIgnoreCase(o2);
			}
		};
		//变形：
		ct = (o1, o2) -> o1.compareToIgnoreCase(o2);
		
		//再变
		ct = String::compareToIgnoreCase;
		
		//
		List<Animal> aniList = Arrays.asList(new Fish(), new Cat(), new Dog());
		//
		System.out.println("---- 排序前 ------------");
		aniList.forEach(System.out::println);
		//排序
		Collections.sort(aniList, Animal::compareByName); //类的普通方法引用
		//
		System.out.println("---- 排序后 ------------");
		aniList.forEach(System.out::println);
		
		//实例方法引用
		String obj = "jack";
		Consumer<String> cstr = (t) -> System.out.println(obj.concat(t));
		//
		cstr.accept(",Hi");
		//
		Supplier<Integer> sstr = obj::length; //相当于： () -> obj.length();
		System.out.println(sstr.get());
	}
}
